package org.web.accesscontrollist.sdk.dto.query;

import jakarta.validation.constraints.*;
import java.util.*;
import lombok.Getter;
import lombok.Setter;
import org.web.base.domain.InsertGroup;
import org.web.base.domain.QueryBase;
import org.web.base.domain.UpdateGroup;

@Setter
@Getter
public class QueryAclResourceDetailRequest extends QueryBase {
    /**
     * 圈定 'specifiedAttributeSet' 返回属性信息范围，指定的属性信息与列定义名称保持一致。
     */
    public static final Set<String> COLUMN_SET = new HashSet<>(Arrays.asList( "acl_resource_detail_id", "acl_resource_type_id", "business_line", "type_name", "detail_name", "detail_status", "detail_extends_value", "detail_comment", "resource_level", "first_level", "second_level", "third_level", "fourth_level", "fifth_level", "is_allow_show", "sort_num", "operator_num", "operator_name", "create_time", "update_time","is_delete"));


    /**
     * 根据 'aclResourceDetailId' 精确查询, 'aclResourceDetailId' 表示主键，资源详情的主键信息，是用户与资源绑定信息的外键。
     */
    private Integer aclResourceDetailId;

    /**
     * 设置 'aclResourceDetailId' 列表查询, 'aclResourceDetailId' 表示主键，资源详情的主键信息，是用户与资源绑定信息的外键。
     */
    private List < Integer > aclResourceDetailIdList;

    /**
     * 根据 'aclResourceTypeId' 精确查询, 'aclResourceTypeId' 表示外键，acl_resource_type表的主键。接入的使用方，并不使用该字段，只做内部字段使用。接入方通过business_line、type_name进行关联，不受外键变更影响。
     */
    private Integer aclResourceTypeId;

    /**
     * 设置 'aclResourceTypeId' 列表查询, 'aclResourceTypeId' 表示外键，acl_resource_type表的主键。接入的使用方，并不使用该字段，只做内部字段使用。接入方通过business_line、type_name进行关联，不受外键变更影响。
     */
    private List < Integer > aclResourceTypeIdList;

    /**
     * 根据 'businessLine' 精确查询, 'businessLine' 表示业务线，冗余【资源类型表】的【business_line】业务线信息，由于其冗余且做为关联使用，一但创建，则不要轻易修改。
     */
    @NotBlank(message = "businessLine can't be blank. ")
    private String businessLine;

    /**
     * 根据 'typeName' 精确查询, 'typeName' 表示资源定义，资源类型定义，来源于【资源类型定义表】，冗余【资源类型表】的【type_name】字段，由于其冗余且做为关联使用，一但创建，则不要轻易修改。
     */
    @NotBlank(message = "typeName can't be blank. ")
    private String typeName;

//    /**
//     * 设置 'typeName' 列表查询, 'typeName' 表示资源定义，资源类型定义，来源于【资源类型定义表】，冗余【资源类型表】的【type_name】字段，由于其冗余且做为关联使用，一但创建，则不要轻易修改。
//     */
//    @NotBlank(message = "typeName can't be blank. ")
//    private List < String > typeNameList;

    /**
     * 根据 'detailName' 精确查询, 'detailName' 表示资源详情名称，业务、资源定义、资源详情名称三者逻辑唯一，冗余【资源类型表】的【detail_name】资源详情名称。
     */
    private String detailName;

    /**
     * 设置 'detailName' 列表查询, 'detailName' 表示资源详情名称，业务、资源定义、资源详情名称三者逻辑唯一，冗余【资源类型表】的【detail_name】资源详情名称。
     */
    private List < String > detailNameList;

    /**
     * 根据 'detailStatus' 精确查询, 'detailStatus' 表示资源详情状态，算做外置业务字段，ON生效,OFF失效。
     */
    @Pattern(regexp = "^(ON|OFF)$", message = "资源详情状态，算做外置业务字段，ON生效,OFF失效。")
    private String detailStatus;

    /**
     * 设置 'detailStatus' 列表查询, 'detailStatus' 表示资源详情状态，算做外置业务字段，ON生效,OFF失效。
     */
    private List < String > detailStatusList;

    /**
     * 根据 'detailExtendsValue' 精确查询, 'detailExtendsValue' 表示拓展值，供业务线接入方自行扩展。
     */
    private String detailExtendsValue;

    /**
     * 根据 'resourceLevel' 精确查询, 'resourceLevel' 表示资源等级，用树状结构描述资源。
     */
    private Integer resourceLevel;

    /**
     * 设置 'resourceLevel' 列表查询, 'resourceLevel' 表示资源等级，用树状结构描述资源。
     */
    private List < Integer > resourceLevelList;

    /**
     * 根据 'firstLevel' 精确查询, 'firstLevel' 表示一级，描述一级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    private String firstLevel;

    /**
     * 设置 'firstLevel' 列表查询, 'firstLevel' 表示一级，描述一级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    private List < String > firstLevelList;

    /**
     * 根据 'secondLevel' 精确查询, 'secondLevel' 表示二级，描述二级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    private String secondLevel;

    /**
     * 设置 'secondLevel' 列表查询, 'secondLevel' 表示二级，描述二级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    private List < String > secondLevelList;

    /**
     * 根据 'thirdLevel' 精确查询, 'thirdLevel' 表示三级，描述三级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    private String thirdLevel;

    /**
     * 设置 'thirdLevel' 列表查询, 'thirdLevel' 表示三级，描述三级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    private List < String > thirdLevelList;

    /**
     * 根据 'fourthLevel' 精确查询, 'fourthLevel' 表示四级，描述四级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    private String fourthLevel;

    /**
     * 设置 'fourthLevel' 列表查询, 'fourthLevel' 表示四级，描述四级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    private List < String > fourthLevelList;

    /**
     * 根据 'fifthLevel' 精确查询, 'fifthLevel' 表示五级，描述五级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    private String fifthLevel;

    /**
     * 设置 'fifthLevel' 列表查询, 'fifthLevel' 表示五级，描述五级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    private List < String > fifthLevelList;

    /**
     * 根据 'isAllowShow' 精确查询, 'isAllowShow' 表示允许查询, 用于表示资源信息是否允许被查询。enum={Y:允许;N:不允许}。
     */
    private String isAllowShow;

    /**
     * 根据 'sortNum' 精确查询, 'sortNum' 表示排序，排序用于列表展示排序，多为数值。
     */
    private String sortNum;

    /**
     * 设置大于 'sortNum' 查询, 'sortNum' 表示排序，排序用于列表展示排序，多为数值。
     */
    private String moreThanSortNum;

    /**
     * 设置小于 'sortNum' 查询, 'sortNum' 表示排序，排序用于列表展示排序，多为数值。
     */
    private String lessThanSortNum;

    /**
     * 设置大于等于 'sortNum' 查询, 'sortNum' 表示排序，排序用于列表展示排序，多为数值。
     */
    private String equalAndMoreThanSortNum;

    /**
     * 设置小于等于 'sortNum' 查询, 'sortNum' 表示排序，排序用于列表展示排序，多为数值。
     */
    private String equalAndLessThanSortNum;

    /**
     * 根据 'operatorNum' 精确查询, 'operatorNum' 表示操作员ID，上次修改记录的操作人员工号，唯一标识操作人员。
     */
    private String operatorNum;

    /**
     * 设置 'operatorNum' 列表查询, 'operatorNum' 表示操作员ID，上次修改记录的操作人员工号，唯一标识操作人员。
     */
    private List < String > operatorNumList;

    /**
     * 根据 'operatorName' 精确查询, 'operatorName' 表示操作员，上次修改记录的操作人员名称。
     */
    private String operatorName;

    /**
     * 设置 'operatorName' 列表查询, 'operatorName' 表示操作员，上次修改记录的操作人员名称。
     */
    private List < String > operatorNameList;

    /**
     * 设置大于 'createTime' 查询, 'createTime' 表示创建时间，用于记录创建时间，该记录，后面不会再次被修改。
     */
    private Date moreThanCreateTime;

    /**
     * 设置小于 'createTime' 查询, 'createTime' 表示创建时间，用于记录创建时间，该记录，后面不会再次被修改。
     */
    private Date lessThanCreateTime;

    /**
     * 设置大于等于 'createTime' 查询, 'createTime' 表示创建时间，用于记录创建时间，该记录，后面不会再次被修改。
     */
    private Date equalAndMoreThanCreateTime;

    /**
     * 设置小于等于 'createTime' 查询, 'createTime' 表示创建时间，用于记录创建时间，该记录，后面不会再次被修改。
     */
    private Date equalAndLessThanCreateTime;

    /**
     * 设置大于 'updateTime' 查询, 'updateTime' 表示修改时间，用于记录修改时间，每次记录发生变更，都会变化。
     */
    private Date moreThanUpdateTime;

    /**
     * 设置小于 'updateTime' 查询, 'updateTime' 表示修改时间，用于记录修改时间，每次记录发生变更，都会变化。
     */
    private Date lessThanUpdateTime;

    /**
     * 设置大于等于 'updateTime' 查询, 'updateTime' 表示修改时间，用于记录修改时间，每次记录发生变更，都会变化。
     */
    private Date equalAndMoreThanUpdateTime;

    /**
     * 设置小于等于 'updateTime' 查询, 'updateTime' 表示修改时间，用于记录修改时间，每次记录发生变更，都会变化。
     */
    private Date equalAndLessThanUpdateTime;

    /**
     * 根据 'isDelete' 精确查询, 'isDelete' 表示是否删除，标记是否逻辑删除，enum={Y:删除;N:不删除}
     */
    @Pattern(regexp = "^([YN])$", message = "Y:删除;N:不删除")
    private String isDelete;

    @NotNull(message = "pageSize 不能为空")
    @Max(value = 200, message = "pageSize 不能大于200")
    public Integer getPageSize() {
        return super.getPageSize();
    }

}
